package aphorism;

import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 * Diese Klasse kümmert sich um die gesamte grafische Oberflaeche des Programmes.
 * <br>
 * Dabei werden Ein- und Ausgabefelder in verschachtelte Layouts gesetzt, um auch beim vergroessern und verkleinern des Fensters eine angemessene Anzeige zu bekommen.
 * 
 * @author Patrick Bauer
 * @version 1.0
 */
public class MainWindow extends JFrame {
    
    /**
     * Als einziger Konstrukter der Klasse kümmert dieser sich um die Befuellung des Hauptfensters.
     * <br>
     * Dabei wird darauf geachtet LayoutManager zu nutzen, sodass die Elemente sich der Grösse des Fensters anpassen.
     * <br>
     * Neben dem Instanzieren und Anordnen der Elemente, kuemmert sich die Methode um die Verbindung zwischen Ein- und Ausgabe.
     */
    public MainWindow() {
        //setze Box-Layout fuer den Frame (MainWindow)
        BoxLayout boxLayout = new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS);
        this.setLayout(boxLayout);
        
        //erstelle neues Panel mit Grid-Layout
        GridLayout gl = new GridLayout(2,6);
        gl.setHgap(20);
        
        JPanel grid = new JPanel(gl);
        grid.setMaximumSize(new Dimension(99999,50));
        
        //erstelle neues StringPanel
        StringPanel stringPanel = new StringPanel();
        stringPanel.setBorder(BorderFactory.createLoweredBevelBorder());
        stringPanel.setMinimumSize(new Dimension(0, 300));
        stringPanel.setPreferredSize(new Dimension(0, 300));
        
        //instanziere Comboboxen
        AphorismSelect aphorismSelect  = new AphorismSelect();       
        BackgroundColorSelect backgroundColorSelect = new BackgroundColorSelect();
        FontColorSelect fontColorSelect = new FontColorSelect();
        FontFamilySelect fontFamilySelect = new FontFamilySelect();
        FontStyleSelect fontStyleSelect = new FontStyleSelect();
        FontSizeSelect fontSizeSelect = new FontSizeSelect();
        
        //weise den Comboboxen das StringPanel zu
        aphorismSelect.setStringPanel(stringPanel);
        backgroundColorSelect.setStringPanel(stringPanel);
        fontColorSelect.setStringPanel(stringPanel);
        fontFamilySelect.setStringPanel(stringPanel);
        fontStyleSelect.setStringPanel(stringPanel);
        fontSizeSelect.setStringPanel(stringPanel);
        
        //fuege dem Grid die Beschreibungen hinzu 
        grid.add(new JLabel("Aphorismus"));
        grid.add(new JLabel("Hintergrundfarbe"));
        grid.add(new JLabel("Schriftfarbe"));
        grid.add(new JLabel("Schriftfamilie"));
        grid.add(new JLabel("Schriftstil"));
        grid.add(new JLabel("Schriftgroesse"));
        
        //fuege dem Grid die Comboboxen hinzu
        grid.add(aphorismSelect);
        grid.add(backgroundColorSelect);
        grid.add(fontColorSelect);
        grid.add(fontFamilySelect);
        grid.add(fontStyleSelect);
        grid.add(fontSizeSelect);
        
        //setze Stringpanel und Combobox-Grid in das Boxlayout
        this.getContentPane().add(stringPanel);
        this.getContentPane().add(grid);
    }

    /**
     * Setzt die Parameter fuer die Anzeige des Fensters und zeigt es anschliessend an.
     * <br>
     * Dabei wird der benötigte Platz für alle Elemente berechnet und dieser als minimale Groesse des Fensters angegeben.
     * <br>
     * So wird sichergestellt, dass immer alle Elemente zu sehen sind.
     */
    public void showWindow() {
        this.setTitle("Aphorismen");
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.pack();
        this.setMinimumSize(this.getSize());
        this.setVisible(true);
    }
    
}
